#include<iostream>
using namespace std;
/*
两种分类方式：
    按参数分为：有参构造和无参构造(默认构造)
    按类型分为：普通构造和拷贝构造
三种调用方式：
    括号法
    显示法
    隐式转换法
*/
class Person
{
public:
    //无参构造
    Person()
    {
        cout<<"Person的构造函数调用"<<endl;
    }
    Person(int a)
    {
        age=a;
        cout<<"Person的有参构造函数调用"<<endl;
    }
    //拷贝构造函数
    Person(const Person &p)
    {
        //将传入的人身上的所有属性，拷贝到我身上
        age=p.age;
        cout<<"Person的拷贝构造函数调用"<<endl;
    }
    ~Person()
    {
        cout<<"Person的析构函数调用"<<endl;
    }

    int age;
};
//调用
void test01()
{
    //1括号法
    Person p1;//默认构造函数调用
    Person p2(10);//有参构造函数
    Person p3(p2);//拷贝构造函数
    //注意事项
    //调用默认构造函数时，不要加()
    //因为下面这行代码，编译器会认为是一个函数的声明
    // Person p1();

    //2显示法
    Person p4;
    Person p5=Person(10);//有参构造
    Person p6=Person(p5);//拷贝构造

    Person(10);//匿名对象，特点：当前执行结束后，系统会立即回收掉匿名对象
    cout<<"aaa"<<endl;
    //注意事项2
    //不要利用拷贝构造函数，初始化匿名对象,编译器会认为Person (p3)等价于Person p3；对象声明
    // Person(p3);

    //3隐式转换法
    Person p7=10;//相当于写了Person p4=Person(10);有参构造
    Person p8=p7;//拷贝构造


}
int main()
{
    test01();
}
